package `02-lambada`

/**
 * 高阶函数的使用案例：模拟点击事件（java的回调）
 */

class TouListener<T>{
    /**
     * 集合保存注册的监听事件，类型是函数，函数的输入输泛型T，输出是Unit
     */
    var actions = arrayListOf<(T)->Unit>()

    /**
     * 集合 保存监听事件数据，类型是泛型T
     */
    var vaules = arrayListOf<T>()

    //注册监听
    fun  addListener(value: T,action:(T)->Unit){
        actions += action
        vaules += value
    }

    //模拟触摸
    fun touch(){
        if(actions.isEmpty()){
            println("您还没有添加Listener")
            return
        }

        //循环触发Listener事件
        actions.forEachIndexed { index:Int, action:(T)->Unit ->
            action.invoke(vaules[index])
        }
    }
}

fun main() {
    var touListener = TouListener<String>()

    touListener.touch()

    println()

    touListener.addListener("1"){
        println("事件被触发，数值是$it")
    }

    touListener.addListener("2"){
        println("事件被触发，数值是$it")
    }

    touListener.addListener("3"){
        println("事件被触发，数值是$it")
    }

    touListener.touch()
}